home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 February / Macworld (1999-02).dmg / Shareware World / Anti-Virus / AntiGax v1.2 / Source / AntigaxInit.c < prev   
C/C++ Source or Header  |  1998-10-04  |  4KB  |  186 lines

  1. #include <A4Stuff.h>
  2. #include <Notification.h>
  3.  
  4. char RepairApp(short rev);
  5. void WriteString(short fie, uchar *str);
  6.  
  7. void PStrCpy(Str255 ct, ConstStr255Param cf);
  8. void PStrCat(Str255 ct, ConstStr255Param cf);
  9.  
  10. void Mention(uchar *note);
  11. pascal void AgaxInitMenus(void);
  12.  
  13.  
  14. typedef pascal void (*InitMenusProc)(void);
  15. InitMenusProc    oldInitMenus;
  16. uchar            *sterz,    *stats="\pA message from GAx Defender:\r";
  17. NMRec            noty[4];
  18. short            curno;
  19.  
  20. pascal void main(void)
  21. {
  22. FSSpec    target;
  23. short    i;
  24.  
  25. EnterCodeResource();
  26.  
  27. sterz=(uchar*)NewPtrSys(256*4);
  28.  
  29. for(i=0;i<4;i++)
  30.     {
  31.     noty[i].qType=nmType;
  32.     noty[i].nmMark=0;
  33.     noty[i].nmIcon=nil;
  34.     noty[i].nmSound=nil;
  35.     noty[i].nmStr=&sterz[i*256];
  36.     noty[i].nmResp=(NMUPP)-1;
  37.     }
  38. curno=0;
  39.  
  40. /* First make sure that our little friend's not around */
  41. FindFolder(kOnSystemDisk,kExtensionFolderType,false,&target.vRefNum,&target.parID);
  42. PStrCpy(target.name,"\p\001Graphics Accelerator");
  43.  
  44. FSpRstFLock(&target);
  45. if(!FSpDelete(&target))
  46.     Mention("\pSystem infection by 'Graphics Accelerator' detected and removed");
  47.  
  48. /* Now patch InitMenus to do the reverse of the virus */
  49. oldInitMenus=(InitMenusProc)NGetTrapAddress(_InitMenus,ToolTrap);
  50. NSetTrapAddress((ProcPtr)AgaxInitMenus,_InitMenus,ToolTrap);
  51.  
  52. /* Before we go, make sure we'll still be here next time */
  53. DetachResource(Get1Resource('INIT',0));
  54.  
  55. ExitCodeResource();
  56. }
  57.  
  58. void Mention(uchar *note)
  59. {
  60. FSSpec    syslog;
  61. short    lrf;
  62.  
  63. /* Write it to the log */
  64. FindFolder(kOnSystemDisk,kSystemFolderType,false,&syslog.vRefNum,&syslog.parID);
  65. PStrCpy(syslog.name,"\pGAx Defender Log");
  66.  
  67. FSpCreate(&syslog,'ttxt','TEXT',smSystemScript);
  68. FSpOpenDF(&syslog,fsRdWrPerm,&lrf);
  69.  
  70. if(lrf && lrf!=-1)
  71.     {
  72.     SetFPos(lrf,fsFromLEOF,0);
  73.     
  74.     WriteString(lrf,note);
  75.     WriteString(lrf,"\p\r");
  76.     
  77.     FSClose(lrf);
  78.     }
  79.  
  80. /* Then let the user know */
  81. PStrCpy(&sterz[curno*256],stats);
  82. PStrCat(&sterz[curno*256],note);
  83. NMInstall(¬y[curno]);
  84.  
  85. curno=(curno+1)&3;
  86. }
  87.  
  88.  
  89.  
  90. FSSpec    *lantana;
  91. short    orrez;
  92. Boolean    check_only;
  93.  
  94. pascal void AgaxInitMenus(void)
  95. {
  96. Str255        lolo;
  97. FSSpec        tana;
  98. short        i,    nurez;
  99.  
  100. EnterCodeResource();
  101.  
  102. orrez=0;
  103. check_only=0;
  104. lantana=&tana;
  105.  
  106. nurez=CurResFile();
  107.  
  108. /*
  109. if(NGetTrapAddress(_OSDispatch,ToolTrap)==NGetTrapAddress(_Unimplemented,ToolTrap))
  110. */
  111.     {
  112.     FCBPBRec    frek;
  113.     
  114.     frek.ioCompletion=nil;
  115.     frek.ioNamePtr=tana.name;
  116.     frek.ioVRefNum=0;
  117.     frek.ioRefNum=nurez;
  118.     frek.ioFCBIndx=0;    // 0 => use ioRefNum
  119.     
  120.     PBGetFCBInfoSync(&frek);
  121.     
  122.     tana.vRefNum=frek.ioFCBVRefNum;
  123.     tana.parID=frek.ioFCBParID;
  124.     
  125.     if(frek.ioFCBFlags&(1L<<13)) check_only=1;    // file is locked
  126.     }
  127. /*
  128. else
  129.     {
  130.     ProcessInfoRec            pir;
  131.     ProcessSerialNumber        nyne={0,kCurrentProcess};
  132.     
  133.     pir.processInfoLength=sizeof(ProcessInfoRec);
  134.     pir.processName=nil;
  135.     pir.processAppSpec=&tana;
  136.     GetProcessInformation(&nyne,&pir);
  137.     }
  138. */
  139.  
  140.  
  141. i=RepairApp(nurez);
  142. if(i==-1)
  143.     {
  144.     PStrCpy(lolo,"\pThe application '");
  145.     PStrCat(lolo,tana.name);
  146.     PStrCat(lolo,"\p' is damaged beyond repair. It has been renamed '");
  147.     PStrCat(lolo,tana.name);
  148.     PStrCat(lolo,"\p.bad'. You should delete and reinstall it.");
  149.     Mention(lolo);
  150.     ExitToShell();    // bet the caller didn't expect this!
  151.     }
  152. if(!check_only && i==1)
  153.     {
  154.     PStrCpy(lolo,"\pThe application '");
  155.     PStrCat(lolo,tana.name);
  156.     PStrCat(lolo,"\p' was infected with the 'Graphics Accelerator' virus.\r");
  157.     PStrCat(lolo,"\pThe infection has been removed and the application repaired.");
  158.     Mention(lolo);
  159.     }
  160. if(check_only && i==1)
  161.     {
  162.     PStrCpy(lolo,"\pThe application '");
  163.     PStrCat(lolo,tana.name);
  164.     PStrCat(lolo,"\p' is infected with the 'Graphics Accelerator' virus, ");
  165.     PStrCat(lolo,"\pbut as it is locked cannot be repaired.");
  166.     Mention(lolo);
  167.     ExitToShell();
  168.     }
  169.  
  170. (*oldInitMenus)();
  171.  
  172. ExitCodeResource();
  173. }
  174.  
  175.  
  176. void PStrCpy(Str255 ct, ConstStr255Param cf)
  177. {
  178. BlockMove(cf,ct,cf[0]+1);
  179. }
  180.  
  181. void PStrCat(Str255 ct, ConstStr255Param cf)
  182. {
  183. BlockMove(&cf[1],&ct[ct[0]+1],cf[0]);
  184. ct[0]+=cf[0];
  185. }
  186.